import { networkStatus } from '../utils/networkStatus';
import requestQueue from '../utils/requestQueue';

// 监听网络状态变化
networkStatus.addListener((isOnline) => {
    if (isOnline) {
        requestQueue.processQueue();
    }
});

// 封装API请求
export const apiRequest = async(requestFn) => {
    // 如果在线，直接执行请求
    if (networkStatus.isOnline()) {
        try {
            const response = await requestFn();
            return response;
        } catch (error) {
            console.error('API请求错误:', error);
            throw handleApiError(error);
        }
    } else {
        // 离线时，将请求添加到队列
        console.log('网络离线，请求已加入队列');
        // 修改：将请求函数和参数分开传递
        return requestQueue.add(
            async() => {
                try {
                    return await requestFn();
                } catch (error) {
                    throw handleApiError(error);
                }
            }
        );
    }
};

// 处理API错误
const handleApiError = (error) => {
    // 处理错误响应
    if (error.response) {
        const { status, data } = error.response;

        // 如果服务器返回了错误信息，直接抛出
        if (data && data.msg) {
            return new Error(data.msg);
        }

        // 否则根据状态码返回通用错误信息
        switch (status) {
            case 400:
                return new Error('请求参数错误');
            case 401:
                return new Error('未授权，请重新登录');
            case 403:
                return new Error('没有权限执行此操作');
            case 404:
                return new Error('请求的资源不存在');
            case 500:
                return new Error('服务器错误');
            default:
                return new Error('请求失败');
        }
    }

    // 网络错误
    if (error.request) {
        return new Error('网络错误，请检查网络连接');
    }

    // 其他错误
    return error;
};

// 处理 API 响应数据
export const handleResponse = (response) => {
    if (response.code === 0) {
        return response.data;
    }
    throw new Error(response.message || '请求失败');
};

// 处理错误
export const handleError = (error) => {
    console.error('API Error:', error);
    throw error;
};

// 生成请求参数
export const generateParams = (params) => {
    const result = {};
    Object.keys(params).forEach(key => {
        if (params[key] !== undefined && params[key] !== null && params[key] !== '') {
            result[key] = params[key];
        }
    });
    return result;
};

// 格式化日期
export const formatDate = (date) => {
    const d = new Date(date);
    return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
};